package com.lsnu.ehr.controller;
import java.util.List;
import java.util.Optional;
import java.util.regex.Pattern;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.lsnu.ehr.domain.Pages;
import com.lsnu.ehr.domain.Result;
import com.lsnu.ehr.entity.Depa;
import com.lsnu.ehr.entity.Emp;
import com.lsnu.ehr.jpa.DepaRepository;
import com.lsnu.ehr.jpa.EmpRepository;

/**
 * 部门控制器
 * @author 小七
 *
 */
// 允许跨域请求
@CrossOrigin
// 以json形式返回
@ResponseBody
// 控制器
@Controller

public class DepaController {
	private static final Integer pageLength = 12;
	// 依赖注入，类似于配置spring的bean
	@Autowired
	DepaRepository repositories;
	@Autowired
	EmpRepository empRepository;
	String msg;			// 提示信息
	/**
	 * 添加部门
	 * @param depa
	 * @return
	 */
	@RequestMapping("addDepa")
	public Object addDepa(Depa depa) {
		
		// 使用接口直接存储部门，spring会自动代理接口方法時
		// 返回值是一个持久态的Depa
		Depa dbDepa = repositories.save(depa);
		
		boolean flag = (null != dbDepa.getId());
		
		if(flag)
			msg = "添加成功！";
		else
			msg = "添加失败！";
		
		return new Result(1,flag,msg);
	}
	
	
	@RequestMapping("findDepa")
	public Object findDepa() {
		List<Depa> depas = repositories.findAll();
		return new Result(1, depas);
	}
	/**
	 * 根据id查询部门
	 * @param id
	 * @return
	 */
	@RequestMapping("findById")
	public Object findById(@RequestParam("id") Long id) {
		
		// 使用接口直接存储部门，spring会自动代理接口方法時
		// 返回值是一个持久态的Depa
		Result result = new Result(1);
		result.setData(repositories.findById(id));
		result.setPage(new Pages(1, 1, pageLength));
		return result;
	}
	
	@RequestMapping("updateDepa")
	public Object updateDepa(Depa depa) {
		
		// 使用接口直接存储部门，spring会自动代理接口方法時
		// 返回值是一个持久态的Depa
		Boolean flag = false;
		if(repositories.findById(depa.getId()) != null) {
			repositories.save(depa);
			flag = true;
		}
		
		return new Result(1,flag);
	}
	
	/**
	 * 根据关键字查询部门
	 * @return
	 */
	@RequestMapping("findDepaByKey")
	public Object findDepaByKey(@RequestParam("key") String key,@RequestParam("page") Integer page) {
		// key是否为数字
		Integer count = 0;
		Page<Depa> pageDepa;
		
		System.out.println("key="+key);
		System.out.println("page="+page);
		
		Boolean flag 	= true;
		Order order 	= new Order(Direction.ASC, "id"); // 根据字段id进行排序
		// 分页排序查询
		@SuppressWarnings("deprecation")
		PageRequest pageRequest = new PageRequest(page - 1, pageLength, new Sort(order));
		
		List<Depa> depas = null;
		
		if("".equals(key)) {
			pageDepa = repositories.findAll(pageRequest);
			depas 	 = pageDepa.getContent();
			count 	 = (int)pageDepa.getTotalElements(); 
			return new Result(1, depas, new Pages(page, count, pageLength), "成功！");
		}
		// 判断是否全是数字
		Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
		flag = pattern.matcher(key).matches();  
		
		if(flag) {
			count = 1;
			return findById(new Long(key));
		}else {
			System.out.println(2);
			pageDepa = repositories.findByDepaName(pageRequest, key);
			depas = pageDepa.getContent();
			count = (int)pageDepa.getTotalElements();
		}
		
		return new Result(1, depas, new Pages(page, count, pageLength), "成功！");
	}
	
	/**
	 * 删除部门
	 * @return
	 */
	@RequestMapping("delDepa")
	public Object delDepa(@RequestParam("id") Long id) {
		Boolean flag = false;
		// 使用接口直接存储部门，spring会自动代理接口方法時
		// 查询是否存在此部门
		Optional<Depa> opt = repositories.findById(id);
		
		if( opt != null ) {
			
			List<Depa> depas = findDepaAll(id);
			// 查询部门下的所有员工信息
			List<Emp> emps = empRepository.findEmpDepaById(id);
			// 设置员工的部门为null--后期可进行数据处理
			for(Emp emp : emps) {
				emp.setEmpDiv(null);
			}
			// 设置部门旗下部门的上级部门为空--后期可处理
			for(Depa d : depas) {
				d.setDepaHigher(null);
			}
			repositories.deleteById(id);
			
			flag = true;
		}
		return new Result(1, flag);
		
	}
	
	/**
	 * 根据id查询下级部门
	 * @param id
	 * @return
	 */
	@RequestMapping("findDepaAll")
	public List<Depa> findDepaAll(Long id) {
		return repositories.findDepaHById(id);
	}
}